home *** CD-ROM | disk | FTP | other *** search
/ Software of the Month Club 2000 October / Software of the Month - Ultimate Collection Shareware 277.iso / pc / PROGRAMS / UTILITY / WINLINUX / DATA1.CAB / programs_-_include / ASM-ARM / ECARD.H < prev    next >
C/C++ Source or Header  |  1999-09-17  |  6KB  |  244 lines

  1. /*
  2.  * linux/include/asm-arm/ecard.h
  3.  *
  4.  * definitions for expansion cards
  5.  *
  6.  * This is a new system as from Linux 1.2.3
  7.  *
  8.  * Changelog:
  9.  *  11-12-1996    RMK    Further minor improvements
  10.  *  12-09-1997    RMK    Added interrupt enable/disable for card level
  11.  *
  12.  * Reference: Acorns Risc OS 3 Programmers Reference Manuals.
  13.  */
  14.  
  15. #ifndef __ASM_ECARD_H
  16. #define __ASM_ECARD_H
  17.  
  18. /*
  19.  * Currently understood cards (but not necessarily
  20.  * supported):
  21.  *                        Manufacturer  Product ID
  22.  */
  23. #define MANU_ACORN        0x0000
  24. #define PROD_ACORN_SCSI            0x0002
  25. #define PROD_ACORN_ETHER1        0x0003
  26. #define PROD_ACORN_MFM            0x000b
  27.  
  28. #define MANU_ANT2        0x0011
  29. #define PROD_ANT_ETHER3            0x00a4
  30.  
  31. #define MANU_ATOMWIDE        0x0017
  32. #define PROD_ATOMWIDE_3PSERIAL        0x0090
  33.  
  34. #define MANU_IRLAM_INSTRUMENTS    0x001f
  35. #define MANU_IRLAM_INSTRUMENTS_ETHERN    0x5678
  36.  
  37. #define MANU_OAK        0x0021
  38. #define PROD_OAK_SCSI            0x0058
  39.  
  40. #define MANU_MORLEY        0x002b
  41. #define PROD_MORLEY_SCSI_UNCACHED    0x0067
  42.  
  43. #define MANU_CUMANA        0x003a
  44. #define PROD_CUMANA_SCSI_1        0x00a0
  45. #define PROD_CUMANA_SCSI_2        0x003a
  46.  
  47. #define MANU_ICS        0x003c
  48. #define PROD_ICS_IDE            0x00ae
  49.  
  50. #define MANU_SERPORT        0x003f
  51. #define PROD_SERPORT_DSPORT        0x00b9
  52.  
  53. #define MANU_I3            0x0046
  54. #define PROD_I3_ETHERLAN500        0x00d4
  55. #define PROD_I3_ETHERLAN600        0x00ec
  56. #define PROD_I3_ETHERLAN600A        0x011e
  57.  
  58. #define MANU_ANT        0x0053
  59. #define PROD_ANT_ETHERB            0x00e4
  60.  
  61. #define MANU_ALSYSTEMS        0x005b
  62. #define PROD_ALSYS_SCSIATAPI        0x0107
  63.  
  64. #define MANU_MCS        0x0063
  65. #define PROD_MCS_CONNECT32        0x0125
  66.  
  67. #define MANU_EESOX        0x0064
  68. #define PROD_EESOX_SCSI2        0x008c
  69.  
  70. #define MANU_YELLOWSTONE    0x0096
  71. #define PROD_YELLOWSTONE_RAPIDE32    0x0120
  72.  
  73. #ifdef ECARD_C
  74. #define CONST
  75. #else
  76. #define CONST const
  77. #endif
  78.  
  79. #define MAX_ECARDS    8
  80.  
  81. typedef enum {                /* Cards address space        */
  82.     ECARD_IOC,
  83.     ECARD_MEMC,
  84.     ECARD_EASI
  85. } card_type_t;
  86.  
  87. typedef enum {                /* Speed for ECARD_IOC space    */
  88.     ECARD_SLOW     = 0,
  89.     ECARD_MEDIUM     = 1,
  90.     ECARD_FAST     = 2,
  91.     ECARD_SYNC     = 3
  92. } card_speed_t;
  93.  
  94. typedef struct  {            /* Card ID structure        */
  95.     unsigned short manufacturer;
  96.     unsigned short product;
  97. } card_ids;
  98.  
  99. struct in_ecid {            /* Packed card ID information    */
  100.     unsigned short    product;    /* Product code            */
  101.     unsigned short    manufacturer;    /* Manufacturer code        */
  102.     unsigned char    id:4;        /* Simple ID            */
  103.     unsigned char    cd:1;        /* Chunk dir present        */
  104.     unsigned char    is:1;        /* Interrupt status pointers    */
  105.     unsigned char    w:2;        /* Width            */
  106.     unsigned char    country;    /* Country            */
  107.     unsigned char    irqmask;    /* IRQ mask            */
  108.     unsigned char    fiqmask;    /* FIQ mask            */
  109.     unsigned long    irqoff;        /* IRQ offset            */
  110.     unsigned long    fiqoff;        /* FIQ offset            */
  111. };
  112.  
  113. typedef struct expansion_card ecard_t;
  114. typedef unsigned long *loader_t;
  115.  
  116. typedef struct {            /* Card handler routines    */
  117.     void (*irqenable)(ecard_t *ec, int irqnr);
  118.     void (*irqdisable)(ecard_t *ec, int irqnr);
  119.     void (*fiqenable)(ecard_t *ec, int fiqnr);
  120.     void (*fiqdisable)(ecard_t *ec, int fiqnr);
  121. } expansioncard_ops_t;
  122.  
  123. /*
  124.  * This contains all the info needed on an expansion card
  125.  */
  126. struct expansion_card {
  127.     /* Public data */
  128.     volatile unsigned char *irqaddr;    /* address of IRQ register    */
  129.     volatile unsigned char *fiqaddr;    /* address of FIQ register    */
  130.     unsigned char        irqmask;    /* IRQ mask            */
  131.     unsigned char        fiqmask;    /* FIQ mask            */
  132.     unsigned char          claimed;    /* Card claimed?        */
  133.  
  134.     void            *irq_data;    /* Data for use for IRQ by card    */
  135.     void            *fiq_data;    /* Data for use for FIQ by card    */
  136.     expansioncard_ops_t    *ops;        /* Enable/Disable Ops for card    */
  137.  
  138.     CONST unsigned char    slot_no;    /* Slot number            */
  139.     CONST unsigned char    dma;        /* DMA number (for request_dma)    */
  140.     CONST unsigned char    irq;        /* IRQ number (for request_irq)    */
  141.     CONST unsigned char    fiq;        /* FIQ number (for request_irq)    */
  142.     CONST card_type_t    type;        /* Type of card            */
  143.     CONST struct in_ecid    cid;        /* Card Identification        */
  144.  
  145.     /* Private internal data */
  146.     const char        *card_desc;    /* Card description        */
  147.     CONST unsigned int    podaddr;    /* Base Linux address for card    */
  148.     CONST loader_t        loader;        /* loader program */
  149. };
  150.  
  151. struct in_chunk_dir {
  152.     unsigned int start_offset;
  153.     union {
  154.         unsigned char string[256];
  155.         unsigned char data[1];
  156.     } d;
  157. };
  158.  
  159. /*
  160.  * ecard_claim: claim an expansion card entry
  161.  */
  162. #define ecard_claim(ec) ((ec)->claimed = 1)
  163.  
  164. /*
  165.  * ecard_release: release an expansion card entry
  166.  */
  167. #define ecard_release(ec) ((ec)->claimed = 0)
  168.  
  169. /*
  170.  * Start finding cards from the top of the list
  171.  */
  172. extern void ecard_startfind (void);
  173.  
  174. /*
  175.  * Find an expansion card with the correct cid, product and manufacturer code
  176.  */
  177. extern struct expansion_card *ecard_find (int cid, const card_ids *ids);
  178.  
  179. /*
  180.  * Read a chunk from an expansion card
  181.  * cd : where to put read data
  182.  * ec : expansion card info struct
  183.  * id : id number to find
  184.  * num: (n+1)'th id to find.
  185.  */
  186. extern int ecard_readchunk (struct in_chunk_dir *cd, struct expansion_card *ec, int id, int num);
  187.  
  188. /*
  189.  * Obtain the address of a card
  190.  */
  191. extern unsigned int ecard_address (struct expansion_card *ec, card_type_t card_type, card_speed_t speed);
  192.  
  193. #ifdef ECARD_C
  194. /* Definitions internal to ecard.c - for it's use only!!
  195.  *
  196.  * External expansion card header as read from the card
  197.  */
  198. struct ex_ecid {
  199.     unsigned char    r_irq:1;
  200.     unsigned char    r_zero:1;
  201.     unsigned char    r_fiq:1;
  202.     unsigned char    r_id:4;
  203.     unsigned char    r_a:1;
  204.  
  205.     unsigned char    r_cd:1;
  206.     unsigned char    r_is:1;
  207.     unsigned char    r_w:2;
  208.     unsigned char    r_r1:4;
  209.  
  210.     unsigned char    r_r2:8;
  211.  
  212.     unsigned char    r_prod[2];
  213.  
  214.     unsigned char    r_manu[2];
  215.  
  216.     unsigned char    r_country;
  217.  
  218.     unsigned char    r_irqmask;
  219.     unsigned char    r_irqoff[3];
  220.  
  221.     unsigned char    r_fiqmask;
  222.     unsigned char    r_fiqoff[3];
  223. };
  224.  
  225. /*
  226.  * Chunk directory entry as read from the card
  227.  */
  228. struct ex_chunk_dir {
  229.     unsigned char r_id;
  230.     unsigned char r_len[3];
  231.     unsigned long r_start;
  232.     union {
  233.         char string[256];
  234.         char data[1];
  235.     } d;
  236. #define c_id(x)        ((x)->r_id)
  237. #define c_len(x)    ((x)->r_len[0]|((x)->r_len[1]<<8)|((x)->r_len[2]<<16))
  238. #define c_start(x)    ((x)->r_start)
  239. };
  240.  
  241. #endif
  242.  
  243. #endif
  244.